<?php
	require_once('dados.php');
	// ##############################################
	// # Classe com funções para controlar arquivos #
	// ##############################################
	class FileController
	{
		private $directory;
		private $max_file_size;
				
		public $allowed_files;
		public $erros;
		
		/*
		 * Cria uma instancia de uma classe para controlar uploads de arquivos, erro na criação será colocado no array público de erros com a chave file_controller 
		*/
		function __construct($directory = 'arquivos/', $maxFileSize = null, $allowedFiles = null)
		{
			$this->directory = $directory;
			if(!file_exists($this->directory)) {
				if(!mkdir($this->directory)) {
					$this->erros['file_controller'] = 'Unable To Create Target Directory';
				}
			}
			$this->maxFileSize = isset($maxFileSize) ? $maxFileSize : 51200000;
			$this->allowed_files = isset($allowed_files) ? $allowed_files : array('jpg', 'jpeg', 'bmp', 'png', 'gif', 'swf', 'mov', 'avi', 'wmv', 'flv','mp4');
		}
		
		public function valida($files, $nome_campo, $mensagens_erro = null)
		{
			if(!empty($files)) {
				$info = pathinfo($files[$nome_campo]['name']);
				$extensao_arquivo = $info['extension'];
				
				if(!in_array($extensao_arquivo, $this->allowed_files)) // Se o arquivo não possui uma extensão válida
				{
					$this->erros['tipo_arquivo'] = isset($mensagens_erro['tipo_arquivo']) ? $mensagens_erro['tipo_arquivo'] : "A extensão de arquivo $extensao_arquivo não é permitida para esse campo";
				}
				else if($files[$nome_campo]['size'] > $this->max_file_size)
				{
					$this->erros['arquivo_tamanho'] = isset($mensagens_erro['arquivo_tamanho']) ? $mensagens_erro['arquivo_tamanho'] : "O arquivo excedeu o tamanho máximo permitido";
				}
			}
			else{
				$this->erros['file_controller'] = isset($mensagens_erro['file_controller']) ? $mensagens_erro['file_controller'] : "Não foi passado um array de files";
			}
			return empty($this->erros);// retorna se validou ou não, ou seja, se não teve erros validou e se teve não validou
		}
		
		/*
		 * Move o arquivo para o caminho passado
		 * Em caso de erro verifique o array $erros (verifique as chaves arquivo_tamanho e tipo_arquivo)
		 * @param files o arquivo com as informações sobre os arquivos (normalmente passe o array $_FILES
		 * @param nome_campo o nome do campo no formulário
		 * @param nome_arquivo o nome do arquivo que ficará no diretório
		 * @param mensagens_erro a chave tipo_arquivo dará o erro para uma extensão inválida e a chave arquivo_tamanho para caso do arquivo ter um tamanho maior que o permitido
		 * @return Retorna a extensão do arquivo passado
		*/
		public function upload($files, $nome_campo, $nome_arquivo, $mensagens_erro = null)
		{
			$info = pathinfo($files[$nome_campo]['name']);
			$extensao_arquivo = $info['extension'];
			
			$new_arq = $this->directory . $nome_arquivo . '.'. $extensao_arquivo;
			move_uploaded_file($files[$nome_campo]['tmp_name'], $new_arq);
			
			return $extensao_arquivo;
		}
		
		// Para copiar um arquivo para outro lugar, utilize a função copy do php
		
		// Função copiada da internet que copia dois diretorios
		public static function copy_directory($source, $destination) {
			if((stristr($source, '.svn') != false))
			{
				return;
			}
			if ( is_dir( $source ) ) {
				@mkdir( $destination );
				$directory = dir( $source );
				while ( FALSE !== ( $readdirectory = $directory->read() ) ) {
					if ( $readdirectory == '.' || $readdirectory == '..' ) {
						continue;
					}
					$PathDir = $source . '/' . $readdirectory; 
					if ( is_dir( $PathDir ) ) {
						FileController::copy_directory( $PathDir, $destination . '/' . $readdirectory );
						continue;
					}
					copy( $PathDir, $destination . '/' . $readdirectory );
				}
		 
				$directory->close();
			}else {
				copy( $source, $destination );
			}
		}
		
		// Função copiada da internet que deleta o diretorio passado, incluindo todos os seus arquivos e subdiretórios
		public static function delete_directory($dir) 
		{
			closedir(opendir($dir)); // Evita erros de permissão
			// Retorna todos os arquivos do diretório, GLOB_MARK adiciona uma barra no final dos nomes dos diretórios
		    $files = glob($dir . '*', GLOB_MARK);
		    foreach($files as $file)
		    {
		        if( substr( $file, -1 ) == '/' || substr( $file, -1 ) == "\\") // Se for um diretório
		        {		        
		            FileController::delete_directory( $file );
				}
				else // Se for um arquivo
		        {
		            if(!unlink($file)) // Deleta o arquivo
		            {
		            	return false; // Se falhou ao deletar o arquivo, retorna false
		            }
		        }
		    }
		    if (is_dir($dir)) // Se for um diretório, então estará vazio, logo remove de vez
		    {
		    	// Verifica se existe o diretorio .svn e remove caso existir
		    	if(file_exists("$dir/.svn"))
		    	{
		    		FileController::delete_directory("$dir/.svn");
		    	}
		    	if(!rmdir($dir)) // Remove o diretório
		    	{
		    		return false; // Se falhou ao deletar o diretório, retorna false
		    	}
		    }
		    return true;
		} 
		
		// Substitui uma palavra por outra em um arquivo, cujo caminho é passado em $path
		public static function substitui_palavra($path, $palavra_antiga, $palavra_nova)
		{
			$conteudo_arquivo = file_get_contents($path);
			$novo_conteudo = str_replace($palavra_antiga, $palavra_nova, $conteudo_arquivo);
			file_put_contents($path, $novo_conteudo);
		}
		
		public static function substitui_palavras($paths, $palavras_antigas, $palavras_novas)
		{
			foreach($paths as $path)
			{
				foreach($palavras_antigas as $index => $palavra_antiga)
				{
					$palavra_nova = $palavras_novas[$index];
					FileController::substitui_palavra($path, $palavra_antiga, $palavra_nova);
				}
			}
				
		}
	}
?>